www.gusucode.com > 非局部均值(Non-local Mean)SAR滤波 > 非局部均值(Non-local Mean)SAR滤波/NLMean.m

    function I_out = NLMean(I_in)

[nHeight, nWidth] = size(I_in);

I_out = zeros(nHeight, nWidth);%输出的图像

nSim = 3; %相似窗口为 2*nSim+1

nBlk = 10; %最大块为 2*nBlk+1

h = 0.5; %控制权值的参数

for m=1:nHeight
    for n=1:nWidth
        %求得块边界
        blk_top  = max(1, m-nBlk); blk_bottom = min(nHeight, m+nBlk);
        blk_left = max(1, n-nBlk); blk_right  = min(nWidth,  n+nBlk);

        wDist = zeros(blk_bottom - blk_top + 1, blk_right - blk_left +  1);%用来计算blk内各点的权值
        for i=blk_top:blk_bottom
            for j=blk_left:blk_right
                
                nSum = 0; nCount = 0;%用来统计像素距离和个数
                for i0 = -nSim:nSim
                    for j0 = -nSim:nSim
                        if(m+i0>0 && m+i0<nHeight+1 && n+j0>0 && n+j0<nWidth+1 && i+i0>0 && i+i0<nHeight+1 && j+j0>0 && j+j0<nWidth+1)   %判断两小块是否都在在图像中
                            nSum = nSum + (I_in(m+i0, n+j0) - I_in(i+i0, j+j0))^2;
                            nCount = nCount + 1;%统计两小块窦娥在图像中的像素个数
                        end
                    end
                end
                nDist = nSum / nCount;
                wDist(i-blk_top + 1, j - blk_left +1) = exp(-nDist /(h*h));%将像素灰度距离用指数形式表示,代表权值
            end
        end
        
        Sum_wDist = mean2(wDist) * (blk_bottom - blk_top + 1) *(blk_right - blk_left +  1);%求解权值的综合
        wDist = wDist / Sum_wDist;%归一化权值
        
        I_blk = I_in(blk_top:blk_bottom, blk_left:blk_right);
        I_blk = I_blk .* wDist;
        I_out(m,n) = mean2(I_blk) * (blk_bottom - blk_top + 1) *(blk_right - blk_left +  1);       
    end
    m
end